package originala;

import java.sql.*;
import java.util.HashMap;
import java.util.Vector;

/**
 * Arkitekturaren hirugarren mailaren klase nagusia Singleton diseinu-patroia
 * erabiltzen da instantzia bakarra izateko.
 */

public class AplikazioDatuBase {
	private static AplikazioDatuBase instantzia;

	private Connection konexioa;

	/**
	 * Datu basea hasieratzen
	 */
	public AplikazioDatuBase() {
		try {
			String url = "jdbc:odbc:bidaiak";
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			konexioa = DriverManager.getConnection(url, "", "");
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println("SQL Exception:  "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		System.out.println("datu basera konektatu da");
	}

	/**
	 * Datu base itxi
	 */
	public void finalize() {
		try {
			konexioa.close();
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println("SQL Exception:  "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (Exception anException) {
			anException.printStackTrace();
		}
	}

	/**
	 * Eskuratu azken erreserbaren zenbakia eragiketak egiteko.
	 */

	public int getAzkenErreserbarenZenbakia() {
		// Erazagupenak
		int erreserbarenZenbakia = 0;
		PreparedStatement selectSententzia;
		ResultSet resultSet;
		// Sarrera
		try {
			// Select sententzia sortu
			selectSententzia = konexioa
					.prepareStatement("SELECT MAX (Erreserba_Zenbakia) FROM Erreserba");
			// Select sententzia exekutatu
			resultSet = selectSententzia.executeQuery();

			// ResulSet osagaia aztertzen
			if (resultSet.next()) {
				erreserbarenZenbakia = resultSet.getInt(1);
			}
			System.out.println("Select Max erreserbarenZenbakia = "
					+ erreserbarenZenbakia);
			resultSet.close();
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println("SQL Exception:  "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			System.out.println("Exception:  " + anException.getMessage());
		}
		// Irteera
		finally {
			return erreserbarenZenbakia;
		}
	}

	/**
	 * Erreserba txertatzen datu basean
	 * 
	 * @return count int
	 * @param data
	 *            java.util.Date
	 * @param amount
	 *            double
	 */
	public int sartuErreserba(int erreserbarenZenbakia, String data,
			int pertsonaKopurua, int agentearenKodea) {
		// Erazagupena
		int count = 0;
		PreparedStatement insertSententzia = null;
		// Sarrera
		try {
			// Insert sententzia sortu
			insertSententzia = konexioa
					.prepareStatement("INSERT  INTO " +
							" Erreserba (ErreserbarenZenbakia,Data,PertsonaKopurua,AgentearenZenbakia)" +
							"VALUES (?, ?, ?, ?)");
			
			// Insert sententzia hasieratu
			insertSententzia.setInt(1, erreserbarenZenbakia);
			insertSententzia.setString(2,data);
			insertSententzia.setInt(3, pertsonaKopurua);
			
			insertSententzia.setInt(4, agentearenKodea);
			// Insert sententzia exekutatu
			count = insertSententzia.executeUpdate();
			// Insert sententzia bukatu
			insertSententzia.close();
			System.out.println("Insert Erreserba count : " + count);
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		finally {
			return count;
		}
	}

	/**
	 * Erreserbaren ezugarriak txertatzen datu-basean
	 * 
	 * @return count int
	 * @param data
	 *            java.util.Date
	 * @param amount
	 *            double
	 */
	public int sartutErreserbaIten(int erreserbarenZenbakia,
			int baieztapenZenbakia, double prezioa, String irteerarenKodea,
			java.util.Date data) {
		// Erazagupenak
		int count = 0;
		PreparedStatement insertSententzia = null;
		// Sarrera
		try {
			// Insert sententzia sortu
			insertSententzia = konexioa
					.prepareStatement("INSERT INTO Erreserba_Iten VALUES (?, ?, ?, ?, ?)");
			// Insert sententzia hasieratu
			insertSententzia.setInt(1, erreserbarenZenbakia);
			insertSententzia.setInt(2, baieztapenZenbakia);
			insertSententzia.setDouble(3, prezioa);
			insertSententzia.setString(4, irteerarenKodea);
			insertSententzia.setDate(5, new java.sql.Date(data.getTime()));
			// Insert sententzia exekutatu
			count = insertSententzia.executeUpdate();
			// Insert sententzia amaitu
			insertSententzia.close();
			System.out.println("Insert Iten count : " + count);
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		finally {
			return count;
		}
	}
	/**
	 * Erreserbaren ezugarriak txertatzen datu-basean
	 * 
	 * @return count int
	 * @param data
	 *            java.util.Date
	 * @param amount
	 *            double
	 */
	public int sartutErreserbaIten(String data, int pertsonaKopurua, String agentea, String ordaintzailea, int bidaia){
		// Erazagupenak
		int count = 0;
		PreparedStatement insertSententzia = null;
		// Sarrera
		try {
			// Insert sententzia sortu
			insertSententzia = konexioa
					.prepareStatement("INSERT INTO Erreserba (Eguna,PertsonaKopurua,AgentearenZenbakia,Ordaintzailea,Bidaia)  VALUES (?, ?, ?,?,?);");
			// Insert sententzia hasieratu
			insertSententzia.setString(1, data);
			insertSententzia.setInt(2, pertsonaKopurua);
			insertSententzia.setString(3, agentea);
			insertSententzia.setString(4, ordaintzailea);
			insertSententzia.setInt(5, bidaia);
			
			// Insert sententzia exekutatu
			count = insertSententzia.executeUpdate();
			// Insert sententzia amaitu
			insertSententzia.close();
			System.out.println("Insert Iten count : " + count);
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		finally {
			return count;
		}
	}

	/**
	 * Turistaren datuak txertatzen datu-basean
	 * 
	 * @return count int
	 * @param data
	 *            java.util.Date
	 * @param amount
	 *            double
	 */
	public int sartuTurista(String nan, String izena, String abizena, String helbidea, String telefonoa, int baiZenb)
	{

		// Erazagupenak
		int count = 0;
		PreparedStatement insertSententzia = null;
		// Sarrera
		try {
			// Insert sententzia sortu
			insertSententzia = konexioa
					.prepareStatement("INSERT INTO Turista (NAN, Izena, Abizena, Helbidea, Telefonoa, BaiZenbakia) VALUES (?, ?, ?, ?, ?, ?)");
			// Hasieratu Insert statement
			insertSententzia.setString(1, nan);
			insertSententzia.setString(2, izena);
			insertSententzia.setString(3, abizena);
			insertSententzia.setString(4, helbidea);
			insertSententzia.setString(5, telefonoa);
			insertSententzia.setInt(6, baiZenb);
			// Insert sententzia exekutatu
			count = insertSententzia.executeUpdate();
			// Insert sententzia amaitu
			insertSententzia.close();
			System.out.println("Insert Turista count : " + count);
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		finally {
			return count;
		}
	}
	
	public int sartuOrdaintzailea(String nan, String izena, String abizena, String helbidea, String telefonoa, int baiZenb, String txartela) {

		System.out.println("ordaintzailea datu base");
		// Erazagupenak
		int count = 0;
		PreparedStatement insertSententzia = null;
		// Sarrera
		try {
			// Insert sententzia sortu
			insertSententzia = konexioa
					.prepareStatement("INSERT INTO Ordaintzailea (NAN, Izena, Abizena, Helbidea, Telefonoa, BaiZenb, TxartelZenbakia) "+
							"VALUES (?, ?, ?, ?, ?, ?, ?)");
			// Hasieratu Insert statement
			insertSententzia.setString(1, nan);
			insertSententzia.setString(2, izena);
			insertSententzia.setString(3, abizena);
			insertSententzia.setString(4, helbidea);
			insertSententzia.setString(5, telefonoa);
			insertSententzia.setInt(6, baiZenb);
			insertSententzia.setString(7, txartela);
			// Insert sententzia exekutatu
			count = insertSententzia.executeUpdate();
			// Insert sententzia amaitu
			insertSententzia.close();
			System.out.println("Insert Ordaintzailea count : " + count);
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		finally {
			return count;
		}
	}

	/**
	 * Klasearen instantzia eskuratzeko metodoa
	 * 
	 * @return instance AplikazioDatuBase
	 */
	public static AplikazioDatuBase instance() {
		if (instantzia == null)
			instantzia = new AplikazioDatuBase();
		return instantzia;
	}

	/**
	 * Datuak eskuratzen datu-basetik
	 */

	public HashMap irakurriErreserbarenAgentea() {
		return null;
	}

	public HashMap irakurriIrteerak() {
		return null;
	}

	public Vector irakurriBidaiak() {
		Vector emaitza = new Vector();
		String id, data, mota, desk;
		int pertsonaKop, agenteZbkia = 0, prezioa, egunak;

		// Erazagupenak
		int count = 0;
		PreparedStatement selectSententzia = null;
		ResultSet resultSet;
		// Sarrera
		try {
			// Insert sententzia sortu
			selectSententzia = konexioa
					.prepareStatement("SELECT * FROM Bidaiak");
			// Hasieratu Insert statement

			// Select sententzia exekutatu
			resultSet = selectSententzia.executeQuery();

			while (resultSet.next()) {
				id = resultSet.getString(1);
				data = resultSet.getString(2);
				pertsonaKop = resultSet.getInt(3);
				agenteZbkia = resultSet.getInt(4);
				mota = resultSet.getString(5);
				prezioa = resultSet.getInt(6);
				egunak = resultSet.getInt(7);
				desk = resultSet.getString(8);
				Bidaia bid = new Bidaia(id, data, mota, pertsonaKop,
						agenteZbkia, prezioa, egunak, desk);
				emaitza.addElement(bid);
				System.out.println("Bidaia = " + id);
				count++;
			}
			System.out.println("AgenteZbkia = " + agenteZbkia);
			// Insert sententzia amaitu
			selectSententzia.close();
			System.out.println("Bidaia guztiak eskuratuta : " + count);
			return emaitza;
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		return null;

	}
	

	
	public Vector irakurriBidaiak(String agentea) {
		System.out.println("agentea: "+agentea);
		Vector emaitza = new Vector();
		String id, data, mota, desk;
		int pertsonaKop, agenteZbkia = 0, prezioa, egunak;

		// Erazagupenak
		int count = 0;
		PreparedStatement selectSententzia = null;
		//Statement setentzia = null;
		ResultSet resultSet;
		// Sarrera
		try {
			// Insert sententzia sortu
			selectSententzia = konexioa.prepareStatement("SELECT * FROM Bidaiak INNER JOIN Agenteak ON Bidaiak.agentea = Agenteak.id WHERE izena=?");
			System.out.println(selectSententzia.toString());
			selectSententzia.setString(1, agentea);
			resultSet = selectSententzia.executeQuery();

			while (resultSet.next()) {
				id = resultSet.getString(1);
				data = resultSet.getString(2);
				pertsonaKop = resultSet.getInt(3);
				agenteZbkia = resultSet.getInt(4);
				mota = resultSet.getString(5);
				prezioa = resultSet.getInt(6);
				egunak = resultSet.getInt(7);
				desk = resultSet.getString(8);
				Bidaia bid = new Bidaia(id, data, mota, pertsonaKop,
						agenteZbkia, prezioa, egunak, desk);
				emaitza.addElement(bid);
				System.out.println("1Bidaia = " + id);
				count++;
			}
			System.out.println("1AgenteZbkia = " + agenteZbkia);
			// Insert sententzia amaitu
			selectSententzia.close();
			System.out.println("1Bidaia guztiak eskuratuta : " + count);
			return emaitza;
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		return null;
	}

	public Vector irakurriAgenteak() {
		Vector emaitza = new Vector();
		String id, izena, enpresa;

		// Erazagupenak
		int count = 0;
		PreparedStatement selectSententzia = null;
		ResultSet resultSet;
		// Sarrera
		try {
			// Insert sententzia sortu
			selectSententzia = konexioa
					.prepareStatement("SELECT * FROM Agenteak");
			// Hasieratu Insert statement

			// Select sententzia exekutatu
			resultSet = selectSententzia.executeQuery();

			while (resultSet.next()) {
				id = resultSet.getString(1);
				izena = resultSet.getString(2);
				enpresa = resultSet.getString(3);
				Agentea age = new Agentea(id, izena, enpresa);
				emaitza.addElement(age);
				System.out.println("Agentea = " + id);
				count++;
			}
			// Insert sententzia amaitu
			selectSententzia.close();
			System.out.println("Bidaia guztiak eskuratuta : " + count);
			return emaitza;
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		return null;
	}

	public Vector lortuDatak(String bidaia) {
		System.out.println(bidaia);
		Vector emaitza = new Vector();
		String data;

		// Erazagupenak
		int count = 0;
		PreparedStatement selectSententzia = null;
		ResultSet resultSet;
		// Sarrera
		try {
			// Insert sententzia sortu
			selectSententzia = konexioa
					.prepareStatement("SELECT bidaiaData.data"+
							" FROM Bidaiak INNER JOIN bidaiaData ON Bidaiak.id=bidaiaData.bidaia"+
							" WHERE deskribapena = ?");
			// Hasieratu Insert statement
			selectSententzia.setString(1, bidaia);
			// Select sententzia exekutatu
			resultSet = selectSententzia.executeQuery();

			while (resultSet.next()) {
				data = resultSet.getString(1);
				emaitza.addElement(data);
				System.out.println("Data = " + data);
				count++;
			}
			// Insert sententzia amaitu
			selectSententzia.close();
			System.out.println("Bidaiaren egun kopurua: " + count);
			return emaitza;
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		return null;
	}

	public int getPrezioa(String bidaia) {
		System.out.println(bidaia);
		int emaitza = 0;
		int prezioa;

		// Erazagupenak
		int count = 0;
		PreparedStatement selectSententzia = null;
		ResultSet resultSet;
		// Sarrera
		try {
			// Insert sententzia sortu
			selectSententzia = konexioa.prepareStatement("SELECT Prezioa FROM Bidaiak WHERE deskribapena = ?");
			// Hasieratu Insert statement
			selectSententzia.setString(1, bidaia);
			// Select sententzia exekutatu
			resultSet = selectSententzia.executeQuery();

			if (resultSet.next()) {
				prezioa = resultSet.getInt(1);
				emaitza = prezioa;
				System.out.println("Prezioa = " + prezioa);
				count++;
			}
			// Insert sententzia amaitu
			selectSententzia.close();
			System.out.println("Bidaiaren egun kopurua: " + count);
			return emaitza;
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		return emaitza;
	}

	public int getAgentearenZenbakia(String izena) {
		int emaitza = 0;
		int id;

		// Erazagupenak
		int count = 0;
		PreparedStatement selectSententzia = null;
		ResultSet resultSet;
		// Sarrera
		try {
			// Insert sententzia sortu
			selectSententzia = konexioa.prepareStatement("SELECT id FROM Agenteak WHERE Izena = ?");
			// Hasieratu Insert statement
			selectSententzia.setString(1, izena);
			// Select sententzia exekutatu
			resultSet = selectSententzia.executeQuery();

			if (resultSet.next()) {
				id = resultSet.getInt(1);
				emaitza = id;
				System.out.println("Agente id = " + id);
				count++;
			}
			// Insert sententzia amaitu
			selectSententzia.close();
			return emaitza;
		} catch (SQLException anException) {
			while (anException != null) {
				System.out.println(" SQL Exception : "
						+ anException.getMessage());
				anException = anException.getNextException();
			}
		} catch (java.lang.Exception anException) {
			anException.printStackTrace();
		}
		// Irteera
		return emaitza;
	}





}
